/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.upc.upcdewtaxiremisse.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import pe.edu.upc.upcdewtaxiremisse.model.Chofer;
import pe.edu.upc.upcdewtaxiremisse.model.Cliente;
import pe.edu.upc.upcdewtaxiremisse.model.Distrito;
import pe.edu.upc.upcdewtaxiremisse.model.Servicio;
import pe.edu.upc.upcdewtaxiremisse.model.Tarifa;
import pe.edu.upc.upcdewtaxiremisse.model.Unidad;
import pe.edu.upc.upcdewtaxiremisse.model.Usuario;
import pe.edu.upc.upcdewtaxiremisse.service.TaxiService;
import pe.edu.upc.upcdewtaxiremisse.util.Constantes;

/**
 *
 * @author Enrique
 */
public class ProgramacionServlet extends HttpServlet {

    private TaxiService taxiService;

    @Override
    public void init(ServletConfig config) throws ServletException {
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
        this.taxiService = (TaxiService) context.getBean("taxiService");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        HttpSession session = req.getSession();
        String metodo = req.getParameter("metodo");
        if (metodo == null || metodo.trim().length()==0) {

            SimpleDateFormat sdf = new SimpleDateFormat(Constantes.FORMATO_FECHA);
            String fechaProgramacion = sdf.format(new Date());
            System.out.println("Programacion(metodo=null). Carga Inicial en fecha actual "+ fechaProgramacion +"...");
            Servicio servicio = new Servicio(new Cliente(),new Chofer());
            servicio.setFechaProgramacion(fechaProgramacion);
            List<Servicio> listado = taxiService.getServicios(servicio);
            List<Distrito> distritos = taxiService.getDistritos();
            List<Chofer> choferes = taxiService.getChoferes();
            req.setAttribute("servicio", servicio);
            session.setAttribute("programacion", listado);
            session.setAttribute("distritos", distritos);
            session.setAttribute("choferes", choferes);

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else if (metodo.equals("buscar")) {
            String fechaProgramacion = req.getParameter("fechaProgramacion");
            System.out.println("Programacion(metodo=buscar). Buscando programacion en fecha " + fechaProgramacion + "  ...");
            Servicio servicio = new Servicio(new Cliente(),new Chofer());
            servicio.setFechaProgramacion(fechaProgramacion);
            List<Servicio> listado = taxiService.getServicios(servicio);
            req.setAttribute("servicio", servicio);
            session.setAttribute("programacion", listado);

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else if (metodo.equals("buscarCliente")) {
            String fechaProgramacion = req.getParameter("fechaProgramacion");
            String idCliente = req.getParameter("idCliente");
            System.out.println("Programacion(metodo=buscarCliente). Buscando cliente " + idCliente + "  ...");
            Cliente cliente = taxiService.getCliente(new Cliente(idCliente));
            Servicio servicio = new Servicio(new Cliente(),new Chofer());
            servicio.setFechaProgramacion(fechaProgramacion);
            servicio.setCliente(cliente!=null?cliente:new Cliente());
            req.setAttribute("servicio", servicio);
            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);
        } else if (metodo.equals("calcular")) {
            System.out.println("Programacion(metodo=calcular). Calculando tarifa ...");
            String fechaProgramacion = req.getParameter("fechaProgramacion");
            String fechaRecojo = req.getParameter("fechaRecojo");
            String fechaRegistro = req.getParameter("fechaRegistro");
            String tipoServicio = req.getParameter("tipoServicio");
            String direccionDestino = req.getParameter("direccionDestino");
            String direccionOrigen = req.getParameter("direccionOrigen");
            String distritoDestino = req.getParameter("distritoDestino");
            String distritoOrigen = req.getParameter("distritoOrigen");
            String idCliente = req.getParameter("idCliente");
            String idChofer = req.getParameter("idChofer");
            String nombreCliente = req.getParameter("nombreCliente");

            Servicio servicio = new Servicio();
            servicio.setFechaProgramacion(fechaProgramacion);
            servicio.setFechaRecojo(fechaRecojo);
            servicio.setFechaRegistro(fechaRegistro);
            servicio.setTipodeServicio(tipoServicio);
            servicio.setUsuario((Usuario) session.getAttribute("SessionUsuario"));
            servicio.setDireccionDestino(direccionDestino);
            servicio.setDireccionOrigen(direccionOrigen);
            Tarifa tarifa = new Tarifa();
            tarifa.setIdDistritoDestino(new Distrito(distritoDestino));
            tarifa.setIdDistritoOrigen(new Distrito(distritoOrigen));
            tarifa.setTipodeUnidad(tipoServicio);
            tarifa = taxiService.getTarifa(tarifa);
            Chofer chofer = new Chofer();
            chofer.setIdChofer(idChofer);

            Cliente cliente = new Cliente();
            cliente.setIdCliente(idCliente);
            cliente.setNombre(nombreCliente);

            servicio.setTarifa(tarifa);
            servicio.setChofer(chofer);
            servicio.setCliente(cliente);
            req.setAttribute("servicio", servicio);
            System.out.println("Programacion(metodo=calcular). Importe de tarifa es "+ (tarifa!=null?tarifa.getImporte():"") + "...");
            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else if (metodo.equals("registrar")) {
            System.out.println("Programacion(metodo=registrar). Registrando Programacion ...");
            String fechaProgramacion = req.getParameter("fechaProgramacion");
            String fechaRecojo = req.getParameter("fechaRecojo");
            String fechaRegistro = req.getParameter("fechaRegistro");
            String tipoServicio = req.getParameter("tipoServicio");
            String direccionDestino = req.getParameter("direccionDestino");
            String direccionOrigen = req.getParameter("direccionOrigen");
            String idTarifa = req.getParameter("idTarifa");
            String importe = req.getParameter("importe");
            String idCliente = req.getParameter("idCliente");
            String idChofer = req.getParameter("idChofer");


            Servicio servicio = new Servicio();
            servicio.setFechaProgramacion(fechaProgramacion);
            servicio.setFechaRecojo(fechaRecojo);
            servicio.setFechaRegistro(fechaRegistro);
            servicio.setTipodeServicio(tipoServicio);
            servicio.setUsuario((Usuario) session.getAttribute("SessionUsuario"));
            servicio.setDireccionDestino(direccionDestino);
            servicio.setDireccionOrigen(direccionOrigen);

            Tarifa tarifa = new Tarifa();
            tarifa.setIdTarifa(Integer.valueOf(idTarifa));
            tarifa.setImporte(Float.valueOf(importe));

            Chofer chofer = new Chofer();
            chofer.setIdChofer(idChofer);

            Cliente cliente = new Cliente();
            cliente.setIdCliente(idCliente);

            servicio.setCliente(cliente);
            servicio.setTarifa(tarifa);
            servicio.setChofer(chofer);


            taxiService.insertServicio(servicio);

            Servicio servicio_ = new Servicio();
            servicio_.setFechaProgramacion(fechaProgramacion);
            List<Servicio> listado = taxiService.getServicios(servicio_);
            req.setAttribute("servicio", servicio_);
            session.setAttribute("programacion", listado);

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else if (metodo.equals("cargarUnidad")) {

            String idServicio = req.getParameter("idServicio");

            System.out.println("Programacion(metodo=cargarUnidad). Obteniendo unidades del servicio " + idServicio + " ...");

            Unidad unidad = new Unidad();
            unidad.setEstadoUnidad(Constantes.ESTADO_LIBRE);
            List<Unidad> listado = taxiService.getUnidades(unidad);

            req.setAttribute("idServicio", idServicio);
            req.setAttribute("unidades", listado);

            req.getRequestDispatcher("Vehiculos.jsp").forward(req, resp);

        } else if (metodo.equals("actualizarUnidad")) {
            String idServicio = req.getParameter("idServicio");
            System.out.println("Programacion(metodo=actualizarUnidad). Actualizando unidad en el servicio " + idServicio + " ...");
            String placa = req.getParameter("placa");
            String marca = req.getParameter("marca");
            Unidad unidad = new Unidad();
            unidad.setPlaca(placa);
            unidad.setMarca(marca);
            List<Servicio> listado = (List<Servicio>) session.getAttribute("programacion");
            for (Servicio bean : listado) {
                if (bean.getIdServicio() == Integer.parseInt(idServicio)) {
                    bean.setUnidad(unidad);
                    break;
                }
            }
            session.setAttribute("programacion", listado);

            String fechaProgramacion = listado.get(0).getFechaProgramacion();
            Servicio servicio = new Servicio();
            servicio.setFechaProgramacion(fechaProgramacion);
            req.setAttribute("servicio", servicio);

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else if (metodo.equals("actualizar")) {
            System.out.println("Programacion(metodo=actualizar). Actualizando programaciones ...");
            List<Servicio> listado = (List<Servicio>) session.getAttribute("programacion");
            for(Servicio bean : listado){
                String estado = req.getParameter("estado"+bean.getIdServicio());
                bean.setEstadodeWorkFlow(estado);
            }

            taxiService.updateEstadoServicio(listado);

            String fechaProgramacion = req.getParameter("fechaProgramacion");
            Servicio servicio = new Servicio();
            servicio.setFechaProgramacion(fechaProgramacion);
            listado = taxiService.getServicios(servicio);

            req.setAttribute("servicio", servicio);
            session.setAttribute("programacion", listado);

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        } else {

            req.getRequestDispatcher("Programacion.jsp").forward(req, resp);

        }



    }
}
